package com.oc.mba.util;

import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.JSONUtils;

public class JsonUtil {
	
	static JsonConfig jsonConfig = new JsonConfig();  //建立配置文件
	static {
		jsonConfig.setIgnoreDefaultExcludes(false);//设置默认忽略
		jsonConfig.setExcludes(new String[]{"ocPaper", "ocTopics", "ocQuestionOptions", "ocQuestionTechniques", "ocQuestionSolutions", "ocQuestionSeckills"});
		jsonConfig.registerJsonValueProcessor(Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));  
	}
	
	/**
	 * @brief 将JSON字符串解析成Map<String, String>类型
	 * @param[in] json 需要解析的JSON字符串
	 * @return Map<String, Object> 解析后的Map<String, Object>类型数据
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> jsonSTM(String json) {
		return (Map<String, Object>) JSONObject.fromObject(json, jsonConfig);
	}
	
	/**
	 * @brief 转换JSON字符串成JSONObject
	 * @param[in] json JSON字符串
	 * @return JSONObject
	 */
	public static JSONObject jsonSTO(String json){
		return JSONObject.fromObject(json, jsonConfig);
	}
	
	/**
	 * @brief 取得JSON字符串中key对应的JSONArray
	 * @param[in] json JSON字符串
	 * @param[in] key JSONArray字符串对应的key
	 * @return key对应的JSONArray
	 */
	public static JSONArray jsonGetArray(String json, String key) throws Exception{
		return jsonSTO(json).getJSONArray(key);
	}
	
	/**
	 * @brief 将Map<String, String>类型数据转换成JSON字符串
	 * @param[in] map 要封装成JSON字符串的Map<String, String>类型数据
	 * @return String 组装后的JSON串
	 */
	public static String jsonMTS(Map<String, Object> map) {
		return JSONObject.fromObject(map, jsonConfig).toString();
	}
	
	/**
	 * @brief 将Object类型数据转换成JSON字符串
	 * @param object 要封装成JSON的Object类型数据对象
	 * @return String 组装后的JSON串
	 */
	public static String jsonOTS(Object object) {
		if (JSONUtils.isArray(object)) {
			return JSONArray.fromObject(object, jsonConfig).toString();
		}
		return JSONObject.fromObject(object, jsonConfig).toString();
	}
	
	/**
	 * @brief 将Object类型数据组装成Map<String, String>类型数据
	 * @details
	 * -# 首先调用jsonOTS转换对象成JSON String类型
	 * -# 再调用jsonSTM转成JSON String类型为Map<String, String>
	 * 
	 * @param[in] object 要封装成Map<String, String>类型数据的对象
	 * @return Map<String, String> 解析后的JSON数据
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> jsonOTM(Object object) {
		return (Map<String, Object>)JSONObject.fromObject(object, jsonConfig);
	}

	/**
	 * 判断字符串是否为JSON格式
	 */
	public static boolean mayBeJSON(String jsonStr) {
		return JSONUtils.mayBeJSON(jsonStr);
	}
}